<?php

namespace maotool\core;

use maotool\util\IdUtil;
use ReflectionClass;

class Instance
{

    /**
     * 实例编码
     * @var string
     */
    public $id;

    /**
     * 实例名称
     * @var string
     */
    public $name;

    /**
     * 命名空间
     * @var string|null
     */
    public $namespace;

    /**
     * 是否初始化
     * @var bool
     */
    public $init;

    /**
     * 容器类
     * @var mixed
     */
    public $concrete;

    /**
     * 类
     * @var string
     */
    public $class;

    /**
     * 注解
     * @var mixed
     */
    public $annotations = [];

    /**
     * 引用
     * @var mixed
     */
    public $usages = [];

    /**
     * 实例的路径
     * @var string
     */
    public $path;

    /**
     * 实例
     * @var mixed
     */
    public $instance;

    /**
     * 代理
     * @var mixed;
     */
    public $proxy;

    /**
     * 接口
     * @var ReflectionClass[]
     */
    public $interfaces;

    /**
     * 标签
     * @var array
     */
    public $tags = [];

    /**
     * 父类
     * @var ReflectionClass
     */
    public $fatherClass;

    /**
     * 类型
     * @var string
     */
    public $type;

    /**
     * 实际入参
     * @var array
     */
    public $vars = [];

    /**
     * 入参
     * @var array
     */
    public $params = [];

    /**
     * 构造函数
     * @var array
     */
    public $construct = null;

    /**
     * 是否每次创建新的实例
     * @var bool
     */
    public $newInstance = false;

    /**
     * 调用次数
     * @var int
     */
    public $callCount = 0;

    /**
     * 创建时间
     * @var string
     */
    public $createTime;

    /**
     * 修改时间
     * @var string
     */
    public $updateTime;

    /**
     * 调用时间
     * @var string
     */
    public $callTime;

    /**
     * 实例的备注
     * @var string|null
     */
    public $remarks;

    /**
     * 父级实例
     * @var
     */
    public $parentInstance;

    public function __construct()
    {
        $this->id = IdUtil::simpleUUID();
    }

    /**
     * @param string $name
     * @return void
     */
    public function __get($name)
    {
        if ($name == "instance") {
            $this->updateTime = date("Y-m-d H:i:s");
            $this->callTime = date("Y-m-d H:i:s");
            ++$this->callCount;
            return $this->instance;
        } else {
            return $this->$name;
        }
    }

    public function __set($name, $value)
    {
        if ($name == "instance") {
            $this->instance = $value;
        } else {
            $this->$name = $value;
        }
    }

}